home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / dc15 / chain.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  4.0 KB  |  182 lines

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<dos.h>
  5. #include<direct.h>
  6. #include"list.h"
  7. #include"chain.h"
  8.  
  9. #define    TRUE    (-1)
  10. #define    FALSE    0
  11. #define ERR        (-1)
  12.  
  13.  
  14. char line[]="-------------------------------------------------------------------------------\n";
  15. char top[]="  NO.     FILENAME         SIZE        DATE    TIME             LINE           \n";
  16.  
  17. extern LIST    head;
  18. extern PARA outfile,infile;
  19. extern FILE *ofp;
  20.  
  21.  
  22. void LineCount(void)
  23. {
  24.     int        lcnt=1,cnt=0,readsize=0;
  25.     char     *t;
  26.     LIST    *p;
  27.     FILE    *fp;
  28.     
  29.     for(p=head.next;p!=NULL;p=p->next){
  30.         if((fp=fopen(p->file,"r"))==NULL){
  31.             printf("'%s' can't open.\n",p->file);
  32.             exit(1);
  33.         }
  34.         
  35.         readsize=(p->size)+2; /* +1は最後にいれる'\n'のため */
  36.         p->bf=(char *)malloc(readsize);
  37.         readsize=fread(p->bf,1,readsize,fp);
  38.         p->rsize=readsize+1;         /* LFを外したファイルの大きさ */
  39.         
  40.         t=p->bf;
  41.         if(t==NULL) return;
  42.         lcnt=HEADERLINE+TAILLINE;     /* 注釈が3行と最後の区切り分 */
  43.         for(cnt=0;cnt<readsize;cnt++)
  44.             if(*t++=='\n') lcnt++;
  45.         
  46.         *t='\n';
  47.         p->line=lcnt;
  48.         fclose(fp);
  49.         printf("o");
  50.     }
  51. }
  52.  
  53. /*********************************************
  54.    file.000 ~ file.999のファイルネームを返す.
  55.  ファイル file.000,file.001などは同時にオープン
  56.  することはないので静的変数を使う。
  57. **********************************************/
  58. char *WriteOpenName(char *f)
  59. {
  60.     static int    fnum=0;
  61.     int    i,k;
  62.     char *p;
  63.     
  64.     if(fnum > 999 ) return(NULL);
  65.     
  66.     strcpy(f,outfile.file);
  67.     
  68.     p=strchr(f,'\0'); /* '\0'を探す */
  69.     *p++='.';
  70.     for(i=100,k=fnum;i>=1;i/=10){
  71.         *p++='0'+ k/i;
  72.         k=k % i;
  73.     }
  74.     *p='\0';
  75.     fnum++;
  76.     return(f);
  77. }
  78.  
  79. char *GetTimeString(unsigned short int time,char *timebuf)
  80. {
  81.     char *p=timebuf;
  82.     int    i=0;
  83.     
  84.     i=(time&0xf800)>>11;
  85.     
  86.     if(i<10)    *p++='0';
  87.     else        *p++='0'+ i/10;
  88.     *p++='0'+ i%10;*p++=':';
  89.     
  90.     i=(time&0x07e0)>>5;
  91.     if(i<10)    *p++='0';
  92.     else        *p++='0'+i/10;
  93.     *p++='0'+i%10;*p='\0';
  94.     return(timebuf);
  95. }
  96. char *GetDateString(unsigned short int date,char *datebuf)
  97. {
  98.     char *p=datebuf;
  99.     int    i=0;
  100.     
  101.     i=(date&0xfe00)>>9;
  102.     i=(i+80)%100;
  103.     if(i<10)    *p++='0';
  104.     else        *p++='0'+ i/10;
  105.     *p++='0'+ i%10;*p++='/';
  106.     
  107.     i=(date&0x01e0)>>5;
  108.     if(i<10)    *p++='0';
  109.     else        *p++='0'+i/10;
  110.     *p++='0'+i%10;*p++='/';
  111.     
  112.     i=(date&0x001f);
  113.     if(i<10)    *p++='0';
  114.     else        *p++='0'+i/10;
  115.     *p++='0'+i%10;*p='\0';
  116.     
  117.     return(datebuf);
  118. }
  119.  
  120.  
  121. /****************************************************
  122.  lcnt(行数カウンター)の値は main 関数が保持している。
  123.  lcntはMakeList()の値が入った状態で呼ばれる。
  124. ****************************************************/
  125. void MakeIndex(int lcnt)
  126. {
  127.     int     i=0;
  128.     LIST     *l=NULL;
  129.     char    date[8],time[8];
  130.     
  131.     lcnt+=HEADERLINE+1; /* 上下の区切り用ライン  */
  132.     
  133.     fwrite(top,1,80,ofp);  /* 見出しの最上段     */
  134.     fwrite(line,1,80,ofp); /* 始めの区切り         */
  135.     for(l=head.next,i=1;l!=NULL;l=l->next){
  136.         if(l->flag==TRUE){
  137.             l->sline=lcnt;
  138.             fprintf(ofp,"#%03d  [%12s]   %07d byte  %8s  %4s  (%05d) %05d <---> %05d\n"
  139.                 ,i,l->file,l->size,
  140.                 GetDateString(l->wr_date,date),GetTimeString(l->wr_time,time)
  141.                 ,l->line,l->sline,l->sline+l->line-1);
  142.             lcnt+=l->line;
  143.             i++;
  144.         }
  145.     }
  146.     fwrite(line,1,80,ofp); /* 終わりの区切り */
  147. }
  148.  
  149. void Chain(int m)
  150. {
  151.     LIST *lp;
  152.     char    dd[8],tt[5];
  153.     int    i,dmy;
  154.     
  155.     
  156.     _dos_setdrive(outfile.drive,(unsigned int *)&dmy);
  157.     if(outfile.path[0] != '\0')
  158.         if (_chdir(outfile.path)==ERR){
  159.             printf("ディレクトリの指定が違います.");
  160.             exit(1);
  161.         }
  162.     
  163.     for(i=1,lp=head.next;lp!=NULL;lp=lp->next){
  164.         if(lp->flag==TRUE){
  165.             fwrite(line,1,80,ofp);
  166.             fprintf(ofp,"(%03d/%03d)  %12s %06dbyte %8s %5s  %05d line  %05d <--> %05d\n"
  167.                 ,i++,m,lp->file,lp->size
  168.                 ,GetDateString(lp->wr_date,dd),GetTimeString(lp->wr_time,tt)
  169.                 ,lp->line,lp->sline,lp->sline+lp->line-1);
  170.             fwrite(lp->bf,1,lp->rsize,ofp);
  171.             fwrite(line,1,80,ofp);
  172.         }
  173.     }
  174.     _dos_setdrive(infile.drive,(unsigned int *)&dmy);
  175.     if(outfile.path[0] != '\0')
  176.         if (_chdir(outfile.path)==ERR){
  177.             printf("ディレクトリの指定が違います.");
  178.             exit(1);
  179.         }
  180.     
  181. }
  182.